#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<sys/wait.h>
#include<stdlib.h>

//int main()
//{
//    pid_t pid;
//    pid = fork();
//    if(pid < 0)
//    {
//        printf("%s fork error\n",__FUNCTION__);
//        return 1;
//    } 
//    else if( pid == 0  )
//    { 
//        //child
//        printf("child is run, pid is : %d\n",getpid());
//        sleep(5);
//        exit(257);
//    } 
//    else
//    {
//        int status = 0;
//        pid_t ret = waitpid(-1, &status, 0);//阻塞式等待，等待5S
//        printf("this is test for wait\n");
//        if( WIFEXITED(status) && ret == pid )
//        {
//            printf("wait child 5s success, child return code is :%d.\n",WEXITSTATUS(status));
//        }
//        else
//        {
//            printf("wait child failed, return.\n");
//            return 1;
//        }
//    }
//    return 0;
//void ChildRun()
//{
//        int *p = NULL;
//        int cnt = 5;
//        while(1)
//        {
//            printf("I am child process, pid: %d, ppid:%d, cnt: %d\n", getpid(), getppid(), cnt);
//            sleep(1);
//            cnt--;
//            *p = 100;                                                      
//        }
//}
//
//int main()
//{
//        printf("I am father, pid: %d, ppid:%d\n", getpid(), getppid());
//
//        pid_t id = fork();
//        if(id == 0)
//        {
//            // child
//            ChildRun();
//            printf("child quit ...\n");
//            exit(123);
//        }
//        sleep(7);
//        // father
//        // pid_t rid = wait(NULL);
//        int status = 0;
//        pid_t rid = waitpid(id, &status, 0);
//        if(rid > 0)
//        {
//            printf("wait success, rid: %d\n", rid);                        
//        }
//        else
//        {
//            printf("wait failed !\n");                        
//        }
//        sleep(3);
//        printf("father quit, status: %d, child quit code : %d, child quit signal: %d\n", status, (status>>8)&0xFF, status & 0x7F);
//
//}
int main()
{
    pid_t id = fork();
    if(id < 0)
    {
        printf("%s fork error\n", __FUNCTION__);
        return 1;
    }
    else if(id == 0)
    {
        //child
        printf("i am child process\n");
        sleep(5);
        exit(0);
    }
    else 
    {
        //father
        int status = 0;
        pid_t rid = waitpid(id, &status, 0);
        if(rid > 0)
        {
            printf("wait success, rid:%d\n", rid);
        }
        else 
        {
            printf("wait fail!\n");
        }
        printf("father quit, child quit code:%d, coredump:%d, child quit signal:%d\n", (status >> 8)&0xff, (status>>7)&1, status&0x7f);
    }

    return 0;
}
